#include <iostream>
using namespace std;

class Base1
{
public:
  int m_a;

protected:
  int m_b;

private:
  int m_c;
};

class Son1 : public Base1
{
public:
  void func()
  {
    m_a = 10; // 父类中公共权限成员，到子类中依然是公共权限
    m_b = 10; // 父类中保护权限成员，到子类中依然是保护权限
    // m_c = 10; // 父类中私有权限成员，到子类中无法访问 成员 "Base1::m_c" (已声明 所在行数:13) 不可访问
  }
};

void test01()
{
  Son1 s1;
  s1.m_a = 100;
  // s1.m_b = 100; // 保护权限类外无法访问
}

// 保护继承
class Base2
{
public:
  int m_a;

protected:
  int m_b;

private:
  int m_c;
};

class Son2 : protected Base2
{
public:
  void func()
  {
    m_a = 10; // 父类中公共权限成员，到子类中变成保护权限
    m_b = 10; // 父类中保护权限成员，到子类中依然是保护权限
    // m_c = 10; // 父类中私有权限成员，到子类中无法访问
  }
};

void test02()
{
  Son2 s2;
  // s1.m_a = 100; // 保护权限类外无法访问
  // s1.m_b = 100; // 保护权限类外无法访问
}

// 私有继承
class Base3
{
public:
  int m_a;

protected:
  int m_b;

private:
  int m_c;
};

class Son3 : private Base3
{
public:
  void func()
  {
    m_a = 10; // 父类中公共权限成员，到子类中变成私有权限
    m_b = 10; // 父类中保护权限成员，到子类中变成私有权限
    // m_c = 10; // 父类中私有权限成员，到子类中无法访问
  }
};

class GrandSon3 : public Son3
{
public:
  void func()
  {
    // m_a = 1000; // 父类中私有权限成员，到子类中无法访问
    // m_b = 1000; // 父类中私有权限成员，到子类中无法访问
  }
};

void test03()
{
  Son3 s3;
  // s1.m_a = 100; // 私有权限类外无法访问
  // s1.m_b = 100; // 私有权限类外无法访问
}

int main(int argc, char const *argv[])
{
  test01();

  return 0;
}